/*
 * @(#)ConfigurationMapper.java   09/09/13
 *
 * Copyright (C) 2009 Ecole des Mines d'Ales
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Contact: yulinz88@gmail.com
 *
 *
 *
 */



package fr.ema.arch3d.ADL.configuration;

import fr.ema.arch3d.ADL.configuration.componentClass.ComponentClassMapper;
import fr.ema.arch3d.ADL.specification.createSpec;
import fr.ema.arch3d.model.architecture.configuration.ComponentClass;
import fr.ema.arch3d.model.architecture.configuration.Configuration;
import fr.ema.arch3d.model.architecture.configuration.ConnectorClass;
import fr.ema.arch3d.model.architecture.specification.Connection;
import fr.ema.arch3d.model.architecture.specification.Specification;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import java.io.CharArrayWriter;

/**
 * Class description
 *
 *
 * @version        1.0, 09/09/13
 * @author         Huaxi (Yulin) ZHANG
 */
public class ConfigurationMapper extends DefaultHandler {

    // Buffer for collecting data from
    // the "characters" SAX event.

    /** Field description */
    private CharArrayWriter contents = new CharArrayWriter();

    /** Field description */
    ComponentClassMapper cmpClassMapper;

    /** Field description */
    private Configuration config;

    // ConnectionMapper connectionMapper;
    // Parent...

    /** Field description */
    ContentHandler parent;

    // XML Parser

    /** Field description */
    XMLReader parser;

    /**
     * Constructs ...
     *
     *
     * @param parser
     * @param parent
     * @param config
     */
    public ConfigurationMapper(XMLReader parser, ContentHandler parent, Configuration config) {
        this.parent = parent;
        this.parser = parser;
        parser.setContentHandler(this);
        this.config = config;
    }

    public void startElement(String namespaceURI, String localName, String qName, Attributes attr) throws SAXException {
        contents.reset();

        if (localName.equals("specification")) {
            createSpec cs = new createSpec();
            String     sn = attr.getValue("name");

            sn = sn.replace(".", "///");
            sn = sn + ".xml";

            Specification s = cs.create(sn);

            config.specImpl = s;
        }

        // System.out.println("specMApper="+localName+attr.getValue("name"));
        if (localName.equals("component-class")) {
            ComponentClass cmpClass = new ComponentClass();

            cmpClass.name  = attr.getValue("name");
            cmpClassMapper = new ComponentClassMapper(parser, this, cmpClass, config);
            config.component_list.add(cmpClass);
        }

        if (localName.equals("connector-class")) {
            ConnectorClass ctrClass = new ConnectorClass();

            ctrClass.name = attr.getValue("name");

            if (localName.equals("connection")) {
                String connectionName = attr.getValue("name");

                for (int i = 0; i < config.specImpl.connection_list.size(); i++) {
                    Connection connection = (Connection) config.specImpl.connection_list.get(i);

                    if (connection.name.equals(connectionName)) {
                        ctrClass.connection = (Connection) config.specImpl.connection_list.get(i);
                    }
                }
            }

            config.connector_list.add(ctrClass);
        }
    }

    // Override methods of the DefaultHandler class
    // to gain notification of SAX Events.
    //
    // See org.xml.sax.ContentHandler for all available events.
    //
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
        if (localName.equals("configuration")) {

            // swap content handler back to parent
            parser.setContentHandler(parent);
        }
    }

    public void characters(char[] ch, int start, int length) throws SAXException {

        // accumulate the contents into a buffer.
        contents.write(ch, start, length);
    }
}
